package com.mango.Aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @Author:  MangoCookieMilk
 * @Date:     2020/8/15 17:51
 * @Component 被Spring管理
 * @Aspect 声明他是一个aop的类
 */
@Component
@Aspect
public class TestAspect {

    /**
     *  @Pointcut("execution(* com.mango.service.*.*(..))")
     *  execution 括号中的是一个表达式，表面在com.mango.service 这个包下的所有类所有方法所有返回值，所有参数
     *  申明切入点
     *  execution 关键字
     *  *           com.mango.service. *.    *          (..)  )
     *  所有的返回值  包名                         所有类 所有方法   所有的参数
     */
    @Pointcut("execution(* com.mango.service.*.*(..))")
    public void pointcut(){}

    /**
     * @Before("pointcut()")  前置通知，在切入点之前
     * @param joinPoint  可以通过他来获取方法以及参数
     */
    @Before("pointcut()")
    public void before(JoinPoint joinPoint){
        Object [] args = joinPoint.getArgs();
        for (Object arg : args) {
            System.out.println("参数为："+arg);

        }
    }

    /**
     * @param joinPoint
     * @param returnValue
     * @AfterReturning(value = "pointcut()",returning = "returnValue")
     * returning 获取返回值
     */
    @AfterReturning(value = "pointcut()",returning = "returnValue")
    public void returning(JoinPoint joinPoint,Object returnValue){
        System.out.println("结果为："+returnValue);
    }
}
